#include <fstream>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 11;
const int max_bodova = 9;

int n;
int podzadatak;

string rjesenje;
string sluzbeno_rjesenje;

string rijec[maxn];

int main (int argc, char **argv) {
	//checker ispisuje broj osvojenih bodova na primjeru, prvo je unos primjera, a onda sluzbeno, pa nat. rjesenje
	ifstream sluzbeni_input(argv[1]);
	ifstream sluzbeno_rj(argv[2]);
	ifstream nat_rj(argv[3]);	
	sluzbeni_input >> podzadatak >> n;
	for (int i = 0; i < n; i++)
		sluzbeni_input >> rijec[i];
	sluzbeno_rj >> sluzbeno_rjesenje;
	int len = (int)sluzbeno_rjesenje.size();
	if (!(nat_rj >> rjesenje)) {
		cout << 0 << endl;
		cout << "Vas program nije ispisao nista." << endl;
		return 0;
	}
	string smece;
	if (nat_rj >> smece) {
		cout << 0 << endl;
		cout << "Vas program nije ispisao rjesenje u trazenom formatu." << endl;
		return 0;
	}
	int rlen = (int)rjesenje.size();
	int cnt = 0;
	for (int i = 0; i < n; i++) {
		bool ima = 0;
		int curr = (int)rijec[i].size(); 
		for (int j = 0; j < rlen; j++)	{
			if (rlen < curr)
				continue;	
			if (podzadatak == 1) {
				if (rlen - j >= curr && rjesenje.substr(j, curr) == rijec[i])
					ima = 1;
				continue;			
			}
			int fh = min(rlen - j, curr);
			int sh = curr - fh;
			string tmp = rjesenje.substr(j, fh) + rjesenje.substr(0, sh);		
			if (tmp == rijec[i])
				ima = 1;
			if (podzadatak == 3) {
				string rev = rijec[i];
				reverse(rev.begin(), rev.end());
				if (tmp == rev)
					ima = 1;			
			}
		}
		if (ima)
			cnt++;
	}
	int razlika = rlen - len;
	if (cnt >= 4 && razlika < 0) {
		cout << 1 << endl;
		cout << "Nasli ste bolje rjesenje od sluzbenog!" << endl;	
	}
	else if (cnt < 4) 
		cout << 0 << endl;
	else 
		cout << setprecision(70) << (long double)max(0, max_bodova - razlika * 2) / 9 << endl;
	return 0;
}
